/**
 * Software License, Version 1.0
 *
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 *
 *
 *Redistribution and use in source and binary forms, with or without
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For
 * further information contact the Community Grids Lab at
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and
 * wherever such third-party acknowledgments normally appear.
 *
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering,
 * shall not be used to endorse or promote products derived from this software
 * without prior written permission from Indiana University.  For written
 * permission, please contact the Advanced Research and Technology Institute
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering,
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 *
 *
 * Indiana University provides no reassurances that the source code provided
 * does not infringe the patent or any other intellectual property rights of
 * any other entity.  Indiana University disclaims any liability to any
 * recipient for claims brought by any other entity based on infringement of
 * intellectual property rights or otherwise.
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS.
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS",
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION
 *GENERATED USING SOFTWARE.
 */

/**
 * Implements methods defined in cgl_narada_timer_UnixClock.h
 *
 * How to compile this code
 *
 * (example - Linux )
 * g++ -c -I/usr/java/j2sdk1.4.1_03/include
 * -I/usr/java/j2sdk1.4.1_03/include/linux UnixClockImp.c -o liblinuxclock.o
 * ld -shared -o liblinuxclock.so liblinuxclock.o
 *
 * (example - solaris)
 *  gcc -c -I/usr/j2sdk1.4.2/include -I/usr/j2sdk1.4.2/include/solaris -fPIC
 * -shared  UnixClockImp.c -o libsolarisclock.so
 *
 * @author Hasan Bulut  - hbulut@indiana.edu
 * Community Grids Lab., Indiana University
 * @version 1.0
 */
/*
#include <signal.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
//*/
#include <sched.h>

#include <unistd.h>
#include <sys/time.h>  // gettimeofday
#include "cgl_narada_service_timer_UnixClock.h"

JNIEXPORT jlong JNICALL Java_cgl_narada_service_timer_UnixClock_getLocalMicroseconds(JNIEnv *env, jobject obj) {
    struct sched_param scd_prm;
    scd_prm.sched_priority = 10; /* anything greater than 0 */
    sched_setscheduler(0, SCHED_RR, & scd_prm); /* try to set scheduler policy and priority */
    //	setpriority ( PRIO_PROCESS , 0 , 2) ;
    struct timeval now;
    //	int len = 10;
    //	jlong arr[len];
    //	for(int i=0;i<len;i++) {
    gettimeofday(&now, NULL);
    //        printf("now.tv_sec:%lu now.tv_usec:%lu\n", now.tv_sec, now.tv_usec);
    //	arr[i] = (jlong)(now.tv_usec);
    //	usleep(1000);
    //	}
    //	for(int i=0; i<len;i++) {
    //	        printf("t_msec:%I64u\n", arr[i]);
    //	}
    return (jlong) ((now.tv_sec * 1000000.0) + now.tv_usec);
}

JNIEXPORT jlong JNICALL Java_cgl_narada_service_timer_UnixClock_getLocalMilliseconds(JNIEnv *env, jobject obj) {
    struct timeval now;
    gettimeofday(&now, NULL);
    //        printf("now.tv_sec:%lu now.tv_usec:%lu\n", now.tv_sec, now.tv_usec);
    //	usleep(4000);
    //    	gettimeofday(&now, NULL);
    //        printf("now.tv_sec:%lu now.tv_usec:%lu\n", now.tv_sec, now.tv_usec);
    return (jlong) (now.tv_sec * 1000.0 + now.tv_usec / 1000);
}

/*
 * Class:     cgl_narada_timer_UnixClock
 * Method:    getTimeMilliseconds
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_cgl_narada_service_timer_UnixClock_sleep(JNIEnv *env, jobject obj, jint sleepVal) {
    struct sched_param scd_prm;
    scd_prm.sched_priority = 10; /* anything greater than 0 */
    sched_setscheduler(0, SCHED_RR, & scd_prm); /* try to set scheduler policy and priority */
    usleep(sleepVal);
    return;
}
